package com.cjm.algorithm.leetcode.listnode.first;

import com.cjm.algorithm.ListNode;
import com.cjm.algorithm.ListNodeHelp;

import java.util.HashMap;
import java.util.Map;

public class Ti82Medium {
    /**
     * 2023-09-13 22:26:00
     * @param head
     * @return
     */
    public ListNode deleteDuplicates2(ListNode head) {
        Map<Integer, Integer> count = new HashMap<>();
        ListNode cur = head;
        while (cur != null) {
            count.put(cur.val, count.getOrDefault(cur.val, 0) + 1);
            cur = cur.next;
        }
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode pre = dummy;
        cur = head;
        while (cur != null) {
            if (count.get(cur.val) > 1) {
                ListNode temp = cur.next;
                pre.next = temp;
                cur = temp;
            } else {
                pre = cur;
                cur = cur.next;
            }
        }
        return dummy.next;
    }
    public ListNode deleteDuplicates1(ListNode head) {
        Map<Integer, Integer> count = new HashMap<>();
        ListNode cur = head;
        while (cur != null){
            count.put(cur.val, count.getOrDefault(cur.val, 0) + 1);
            cur = cur.next;
        }
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode pre = dummy;
        cur = head;
        while (cur != null) {
            if (count.get(cur.val) > 1) {
                ListNode temp = cur.next;
                pre.next = temp;
                cur = temp;
            } else {
                pre = cur;
                cur = cur.next;
            }
        }
        return dummy.next;
    }
    public static ListNode deleteDuplicates(ListNode head) {
        Map<Integer, Integer> map = new HashMap<>();
        ListNode cur = head;
        while (cur != null) {
            int val = cur.val;
            Integer integer = map.get(val);
            if (integer != null) {
                integer += 1;
                map.put(val, integer);
            } else {
                map.put(val, 1);
            }
            cur = cur.next;
        }

        ListNode dummyNode = new ListNode();
        dummyNode.next = head;
        ListNode pre = dummyNode;
        cur = head;
        while (cur != null) {
            int val = cur.val;
            Integer num = map.get(val);
            if (num > 1) {
                ListNode temp = cur.next;
                pre.next = temp;
                cur = temp;
            } else {
                pre = cur;
                cur = cur.next;
            }
        }
        return dummyNode.next;
    }

    public static ListNode del(ListNode head) {
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;
        ListNode pre = dummyNode;
        ListNode cur = head;
        while (cur != null) {
            int val = cur.val;
            if (cur.next != null && val == cur.next.val) {
                while (cur.next != null && val == cur.next.val) {
                    cur = cur.next;
                }
                pre.next = cur.next;
                cur = cur.next;
            } else {
                pre.next = cur;
                pre = cur;
                cur = cur.next;
            }
        }
        return dummyNode.next;
    }

    public static void main(String[] args) {
        /*ListNode listNode = ListNodeHelp.toListNode(new int[]{1,2,3,3,4,4,5});
        ListNode listNode1 = del(listNode);
        ListNodeHelp.printListNode(listNode1);


        ListNode listNode2 = ListNodeHelp.toListNode(new int[]{1,1,1,2,3});
        ListNode listNode3 = del(listNode2);
        ListNodeHelp.printListNode(listNode3);*/
/*
        ListNode listNode = ListNodeHelp.toListNode(new int[]{1, 2, 3, 3, 4, 4, 5});
        ListNode af = del(listNode);
        ListNodeHelp.printListNode(af);*/

        ListNode listNode2 = ListNodeHelp.toListNode(new int[]{1,1});
        ListNode listNode3 = del(listNode2);
        ListNodeHelp.printListNode(listNode3);
    }
}
